a tool for shared writing and social publishing
1import { z } from "zod";
2import { makeRoute } from "../lib";
3import type { Env } from "./route";
4import { getPublicationURL } from "app/lish/createPub/getPublicationURL";
5
6export type SearchPublicationNamesReturnType = Awaited<
7 ReturnType<(typeof search_publication_names)["handler"]>
8>;
9
10export const search_publication_names = makeRoute({
11 route: "search_publication_names",
12 input: z.object({
13 query: z.string(),
14 limit: z.number().optional().default(10),
15 }),
16 handler: async ({ query, limit }, { supabase }: Pick<Env, "supabase">) => {
17 // Search publications by name in record (case-insensitive partial match)
18 const { data: publications, error } = await supabase
19 .from("publications")
20 .select("uri, record")
21 .ilike("record->>name", `%${query}%`)
22 .limit(limit);
23
24 if (error) {
25 throw new Error(`Failed to search publications: ${error.message}`);
26 }
27
28 const result = publications.map((p) => {
29 const record = p.record as { name?: string };
30 return {
31 uri: p.uri,
32 name: record.name || "Untitled",
33 url: getPublicationURL(p),
34 };
35 });
36
37 return { result: { publications: result } };
38 },
39});